﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Interfaces;
using Model;

namespace ControllerLag
{
    public class Controller
    {
        #region Attributter
        // Variable.
        DBfacade dbFacade;
        VareCollection vareCol;
        KundeCollection kundeCol;
        OrdreCollection ordreCol;
        HomepartyCollection homepartyCol;
        Homeparty homeparty;
        SælgerCollection sælgerCol;
        DistributørCollection distributørCol;
        Delordre nuværendeDelordre;
        Ordre nuværendeOrdre;
        ForsendelseCollection forsendelsesColl;
        Forsendelse forsendelse;
        #endregion

        // Konstruktør.
        public Controller(bool indlæsdata = true)
        {
            dbFacade = new DBfacade(this);
            vareCol = new VareCollection();
            kundeCol = new KundeCollection();
            ordreCol = new OrdreCollection();
            homepartyCol = new HomepartyCollection();
            sælgerCol = new SælgerCollection();
            distributørCol = new DistributørCollection();
            forsendelsesColl = new ForsendelseCollection();
            forsendelse = new Forsendelse();


        	if (indlæsdata)
			{
				IndlæsDataFraDBfacaden(); // Indlæser fra databasen af, når controlleren "kaldes".
        	}
        }

        public void IndlæsDataFraDBfacaden()
        {
            dbFacade.IndlæsFraDatabasen();
        }

        #region KundeMetoder
        public Kunde IndlæsKunder(string navn, string adresse, int postNr, int kundeNr, long tlfNr, string mail)
        {
            return kundeCol.OpretKunde(kundeNr, navn, adresse, postNr, tlfNr, mail);
        }

        public Kunde FindKunde(int kundeNr)
        {
            return kundeCol.FindKunde(kundeNr);
        }

        public Kunde FindKundeMail(string mail)
        {
            Kunde nuværendeKunde = kundeCol.FindKundeMail(mail);
            return nuværendeKunde;
        }
        public IEnumerator FindKundeNavn(string navn)
        {
            IEnumerator nuværendeKunder = kundeCol.FindKundeNavn(navn);
            return nuværendeKunder;
        }
        public IEnumerator FindKundePost(int postNr)
        {
            IEnumerator nuværendeKunder = kundeCol.FindKundePost(postNr);
            return nuværendeKunder;
        }
        public Kunde FindKundeTlf(long tlf)
        {
            Kunde k = kundeCol.FindKundeTlf(tlf);
            return k;
        }

        public bool OpretKunde(string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            int kundeNr = dbFacade.OpretKunde(navn, adresse, postNr, tlfNr, mail);
            if (kundeNr != -1)
            {
                kundeCol.OpretKunde(kundeNr, navn, adresse, postNr, tlfNr, mail);
                return true;
            }
            else
            {
                return false;
            }
        }

        public void SletKunde(int kundeNr)
        {
            Kunde nuværendeKunde = kundeCol.FindKunde(kundeNr);
            kundeCol.SletKunde(kundeNr);
        }

        public bool HentKunde(int kundenr)
        {
            return dbFacade.HentKunde(kundenr);
        }
        #endregion

        #region VareMetoder
        public Vare IndlæsVare(int vareNr, string navn, string beskrivelse, double pris, bool aktiv)
        {
            return vareCol.OpretVare(vareNr, navn, pris, beskrivelse, aktiv);
        }

        public Vare IndlæsVare(int vareNr, string navn, string beskrivelse)
        {
            return vareCol.OpretVare(vareNr, navn, beskrivelse);
        }

        public bool OpretVare(string navn, string beskrivelse, double pris, bool aktiv)
        {
            int vareNr = dbFacade.OpretVare(navn, beskrivelse, pris, aktiv);
            if (vareNr != -1)
            {
                vareCol.OpretVare(vareNr, navn, pris, beskrivelse, aktiv);
                return true;
            }
            else
            {
                return false;
            }
        }

        public Vare OpskrivVaresAntal(int varenr, int vareantal)
        {
            Vare vare = forsendelse.FindVareGennemForsendelse(varenr);

            if (vare.VareNr == varenr)
            {
                int vareAntal = forsendelse.OpskrivVareAntal(vareantal);
            }

            return vare;
        }

        public Vare FindVare(int varenr)
        {
            Vare nuværendeVare = vareCol.FindVare(varenr);
            return nuværendeVare;
        }

        public Vare SletVare(int vareNr)
        {
            Vare nuværendeVare = vareCol.FindVare(vareNr);
            vareCol.SletVare(vareNr);
            return nuværendeVare;
        }

        public List<Vare> HentVareliste()
        {
            return vareCol.Vareliste();
        }
        #endregion

        #region OrdreMetoder
        // Steffen
        public Ordre FindOrdre(int ordrenr)
        {
            nuværendeOrdre = ordreCol.FindOrdre(ordrenr);
            return nuværendeOrdre;
        }

        // Steffen
        public List<Model.Ordre> FindOrdredato(DateTime startdato, DateTime slutdato)
        {
            List<Model.Ordre> oListe = ordreCol.FindOrdredato(startdato, slutdato);

            return oListe;
        }

        internal Ordre IndlæsOrdre(int ordreNr, DateTime ordreDato, Homeparty homeParty)
        {
            return ordreCol.OpretOrdre(ordreNr, ordreDato, homeParty);
        }

        internal void IndlæsOrdre(int ordreNr, DateTime ordreDato, int homePartyNr, int sælgerNr)
        {
            ordreCol.OpretOrdre(ordreNr, ordreDato, homepartyCol.FindHomeparty(homePartyNr), sælgerCol.FindSælger(sælgerNr));
        }

        public bool OpretOrdre(DateTime ordreDato, Homeparty homeparty, int sælgerNr)
        {
            int ordrenr = dbFacade.OpretOrdre(ordreDato, homeparty.Id, sælgerNr);
            if (ordrenr != -1)
            {
                nuværendeOrdre = ordreCol.OpretOrdre(ordrenr, ordreDato, homeparty, sælgerCol.FindSælger(sælgerNr));
                return true;
            }
            else
            {
                return false;
            }
        }

        public IEnumerator HentOrdreListe()
        {
            return ordreCol.HentOrdrer();
        }
        
        public int HentOrdrenr()
        {
            return nuværendeOrdre.Ordrenr;
        }
        #endregion

        #region DelordreMetoder
        public Delordre FindDelordre(int ordrenr)
        {
            nuværendeDelordre = ordreCol.FindDelordre(ordrenr);
            return nuværendeDelordre;
        }

        public bool HentKundeDelordre(int kundeid)
        {
            return dbFacade.HentKundeDelordre(kundeid);
        }

        public Delordre KundesDelordre(Kunde kunde)
        {
            return ordreCol.FindDelordreKunde(kunde);
        }

        internal Delordre IndlæsDelOrdre(int ordreid, int kunde, int delordrenr, bool betalt, Betalingsmetode betalingsmetode, string betalingskommentar)
        {
            return ordreCol.OpretDelordre(ordreid, kundeCol.FindKunde(kunde), delordrenr, betalt, betalingsmetode, betalingskommentar);
        }

        internal Delordre IndlæsDelOrdre(int ordreid, Kunde kunde, int delordrenr, bool betalt, Betalingsmetode betalingsmetode)
        {
            return ordreCol.OpretDelordre(ordreid, kunde, delordrenr, betalt, betalingsmetode);
        }

        public bool OpretDelordre(Kunde kunde, bool betalt, Betalingsmetode betalingsmetode, string betalingskommentar)
        {
            int delordreNr = dbFacade.OpretDelordre(kunde.KundeNr, betalt, (int)betalingsmetode, betalingskommentar,
                                                    nuværendeOrdre.Ordrenr);
            if (delordreNr != -1)
            {
                nuværendeDelordre = nuværendeOrdre.OpretDelordre(kunde, delordreNr, betalt, betalingsmetode, betalingskommentar);
                return true;
            }
            return false;
        }

        public bool OpretDelordreLinje(Vare vare, int antalVare, double pris)
        {
            int delordrelinieid = -1;
            if (delordrelinieid != -1)
            {
                nuværendeDelordre.OpretDelordrelinie(delordrelinieid, vare, antalVare, pris);
                return true;
            }
            return false;
        }

        public void SletOrdre(int ordrenr)
        {
            ordreCol.SletOrdre(ordrenr);
        }
        #endregion

        #region HomepartyMetoder
        public Homeparty TilføjHomeparty(Kunde værtinde, DateTime dato, Landsdel region, Sælger sælger)
        {
            homeparty = new Homeparty(1, værtinde, dato, region, sælger);
            return homeparty;
        }

        internal Homeparty IndlæsHomeParty(int homePartyNr, DateTime dato, int region, int sælgerNr, int kundeNr)
        {
            return homepartyCol.TilføjHomeparty(homePartyNr, dato, region, sælgerNr, kundeNr);
        }

        internal Homeparty IndlæsHomeParty(int homePartyNr, DateTime dato, int region, Kunde kunde)
        {
            return homepartyCol.TilføjHomeparty(homePartyNr, kunde, dato, (Landsdel)region);
        }

		internal Homeparty IndlæsHomeParty(int homePartyNr, DateTime dato, int sælgerid, int region, Kunde kunde)
		{
			return homepartyCol.TilføjHomeparty(homePartyNr, kunde, dato, (Landsdel)region, sælgerCol.FindSælger(sælgerid));
		}

        public void TilføjGæst(Kunde kunde)
        {
            homeparty.TilføjGæst(kunde);
        }

        // Steffen
        public List<Homeparty> FindHomeparty(DateTime dato)
        {
            return homepartyCol.FindHomeparty(dato);
        }

		public Homeparty FindHomeparty(int homepartynr)
		{
			return homepartyCol.FindHomeparty(homepartynr);
		}

        // Steffen
        public List<Homeparty> HentHomepartyListe()
        {
            return homepartyCol.HentHomepartyListe();
        }

		public bool HentKundeHomeparties(int kundenr)
		{
			return dbFacade.HentKundeHomeparties(kundenr);
		}
        #endregion

        #region SælgerMetoder
        internal Sælger IndlæsSælger(int sælgerNr, string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            return sælgerCol.TilføjSælger(sælgerNr, navn, adresse, postNr, tlfNr, mail);
        }

        public bool OpretSælger(string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            int sælgerNr = dbFacade.OpretSælger(navn, adresse, postNr, tlfNr, mail);
            if (sælgerNr != -1)
            {
                sælgerCol.TilføjSælger(sælgerNr, navn, adresse, postNr, tlfNr, mail);
                return true;
            }
            else
            {
                return false;
            }
        }

        public void OpretSælger(int sælgerNr, string navn, string adresse, int postNr, long tlfNr, string mail)
        {
            sælgerCol.TilføjSælger(sælgerNr, navn, adresse, postNr, tlfNr, mail);
        }

        public Sælger FindSælger(int sælgerId)
        {
            return sælgerCol.FindSælger(sælgerId);
        }
        #endregion

        #region DistributørMetoder
        public Distributør FindDistributør(int distributørId)
        {
            Distributør nuværendeDistributør = distributørCol.FindDistributør(distributørId);
            return nuværendeDistributør;
        }

        public void SletDistributør(int distributørId)
        {
            distributørCol.SletDistributør(distributørId);
        }
        #endregion

        #region ForsendelsesMetoder
        public List<Forsendelse> HentForsendelser()
        {
            return forsendelsesColl.Forsendelsesliste();
        }
        #endregion

        public void DistributørOrdre(int distributørNr, string navn, string adresse, int postNr, long tlfNr, int region)
        {
            distributørCol.OpretDistributør(distributørNr, navn, adresse, postNr, tlfNr, region);
        }

        public bool OpretDistributør(int distributørNr, string navn, string adresse, int postNr, long tlfNr, int region)
        {
            distributørNr = dbFacade.OpretDistributør(navn, adresse, postNr, tlfNr, region);
            if (distributørNr != -1)
            {
                distributørCol.OpretDistributør(distributørNr, navn, adresse, postNr, tlfNr, region);
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}
